﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Rsa
{
    class GestorBD
    {
        private List<Ementa> _ementas = new List<Ementa>();

        public void addEmenta(Ementa ementa)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                ementaDB eme = new ementaDB();
                eme.campus = ementa.Campus;
                eme.cantina = ementa.Cantina;
                eme.data = ementa.Data;
                eme.jantar = convertToMenuDB(ementa.Jantar);
                eme.almoco = convertToMenuDB(ementa.Almoco);

                ctx.AddToementaDBSet(eme);
                ctx.SaveChanges();
            }
        }

        public void updateMenu(Menu new_menu, int id)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                menuDB m = (from x in ctx.menuDBSet
                             where x.Id == id
                             select x).First();
                m.sopa = new_menu.Sopa;
                m.carne = new_menu.Carne;
                m.peixe = new_menu.Peixe;
                m.vegetariano = new_menu.Vegetariano;
                m.sobremesa = new_menu.Sobremesa;

                ctx.SaveChanges();
            }
        }

        public void updateEmenta(Ementa ementa, int id_ementa)
        {
            int id_almoco = 0;
            int id_jantar = 0;

            id_almoco = getIDAlmoco(id_ementa);
            id_jantar = getIDJantar(id_ementa);

            if (id_almoco!=0)
                updateMenu(ementa.Almoco,id_almoco);
            if (id_jantar!=0)
                updateMenu(ementa.Jantar, id_jantar);
        }

        public int getIDAlmoco(int id)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                var lista = from ementaDB in ctx.ementaDBSet
                            where ementaDB.Id == id
                            select ementaDB;
                foreach (var e in lista)
                    return e.almoco.Id;
            }
            return 0;
        }

        public int getIDJantar(int id)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                var lista = from ementaDB in ctx.ementaDBSet
                            where ementaDB.Id == id
                            select ementaDB;
                foreach (var e in lista)
                    return e.jantar.Id;
            }
            return 0;
        }

        public int existeEmenta(DateTime data, int cantina)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                var lista = from ementaDB in ctx.ementaDBSet
                            where ementaDB.data == data && ementaDB.cantina == cantina
                            select ementaDB;
                foreach (var e in lista)
                    return e.Id;
            }
            return 0;
        }

        public List<Ementa> pesquisaPorData(DateTime data)
        {
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                var lista = from ementaDB in ctx.ementaDBSet
                            where ementaDB.data == data
                            select ementaDB;
                foreach (var e in lista)
                    Ementas.Add(convertToEmenta(e));
            }
            return Ementas;
        }

        public List<Ementa> pesquisaPorData(DateTime data, int dias)
        {
            DateTime data_max = data.AddDays((double)dias);
            using (baseDadosEntities1 ctx = new baseDadosEntities1())
            {
                var lista = from ementaDB in ctx.ementaDBSet
                            where ementaDB.data >= data && ementaDB.data < data_max
                            select ementaDB;
                foreach (var e in lista)
                    Ementas.Add(convertToEmenta(e));
            }
            return Ementas;
        }

        public Ementa convertToEmenta(ementaDB edb)
        {
            Ementa ementa = new Ementa();

            ementa.Campus = (int)edb.campus;
            ementa.Cantina = (int)edb.cantina;
            ementa.Data = edb.data;
            ementa.Almoco = convertToMenu(edb.almoco);
            ementa.Jantar = convertToMenu(edb.jantar);
            return ementa;
        }        

        public menuDB convertToMenuDB(Menu menu)
        {
            menuDB mdb = new menuDB();
            mdb.sopa = menu.Sopa;
            mdb.carne = menu.Carne;
            mdb.peixe = menu.Peixe;
            mdb.vegetariano = menu.Vegetariano;
            mdb.sobremesa = menu.Sobremesa;
            return mdb;
        }

        public Menu convertToMenu(menuDB mdb)
        {
            Menu menu = new Menu();
            menu.Sopa = mdb.sopa;
            menu.Carne = mdb.carne;
            menu.Peixe = mdb.peixe;
            menu.Vegetariano = mdb.vegetariano;
            menu.Sobremesa = mdb.sobremesa;
            return menu;
        }

        internal List<Ementa> Ementas
        {
            get { return _ementas; }
            set { _ementas = value; }
        }

    }
}
